📊 Tutorial Completo de Plotly¶

Plotly Express e Graph Objects¶


Índice¶

  1. Setup e Imports
  2. Carregando os Dados
  3. Introdução ao Plotly Express
  4. Gráficos Básicos com Plotly Express
  5. Introdução ao Graph Objects (go)
  6. Gráficos Avançados com Graph Objects
  7. Customizações e Layouts
  8. Subplots com Plotly
  9. Interatividade
  10. Perguntas Comuns

Links Importantes:¶

  • Documentação Oficial Plotly
  • Galeria de Exemplos
  • Paletas de Cores
  • Dash Framework
  • Comunidade Plotly

#1 - Setup e Imports¶

Instalar plotly se necessário:

In [1]:
# Descomente a linha abaixo se precisar instalar
# !pip install plotly pandas numpy

Importar bibliotecas:

In [2]:
# Imports necessários
import plotly.express as px
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import pandas as pd
import numpy as np

# Para visualizar no Jupyter
import plotly.io as pio
pio.renderers.default = 'notebook'

#2 - Carregando os Dados¶

Vamos usar o dataset Heart para os exemplos.

In [3]:
# Carregar o dataset Heart
df = pd.read_csv('../../Datasets/Heart.csv')
df = df.drop(columns='Unnamed: 0')
print(f"Shape dos dados: {df.shape}")
df.head()
Shape dos dados: (303, 14)
Out[3]:
Age Sex ChestPain RestBP Chol Fbs RestECG MaxHR ExAng Oldpeak Slope Ca Thal AHD
0 63 1 typical 145 233 1 2 150 0 2.3 3 0.0 fixed No
1 67 1 asymptomatic 160 286 0 2 108 1 1.5 2 3.0 normal Yes
2 67 1 asymptomatic 120 229 0 2 129 1 2.6 2 2.0 reversable Yes
3 37 1 nonanginal 130 250 0 0 187 0 3.5 3 0.0 normal No
4 41 0 nontypical 130 204 0 2 172 0 1.4 1 0.0 normal No
In [4]:
# Informações básicas do dataset
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 303 entries, 0 to 302
Data columns (total 14 columns):
 #   Column     Non-Null Count  Dtype  
---  ------     --------------  -----  
 0   Age        303 non-null    int64  
 1   Sex        303 non-null    int64  
 2   ChestPain  303 non-null    object 
 3   RestBP     303 non-null    int64  
 4   Chol       303 non-null    int64  
 5   Fbs        303 non-null    int64  
 6   RestECG    303 non-null    int64  
 7   MaxHR      303 non-null    int64  
 8   ExAng      303 non-null    int64  
 9   Oldpeak    303 non-null    float64
 10  Slope      303 non-null    int64  
 11  Ca         299 non-null    float64
 12  Thal       301 non-null    object 
 13  AHD        303 non-null    object 
dtypes: float64(2), int64(9), object(3)
memory usage: 33.3+ KB
In [5]:
# Criar coluna numérica para AHD
df['AHD_Numerical'] = df['AHD'].map({'No': 0, 'Yes': 1})
print("✅ Coluna AHD_Numerical criada!")
✅ Coluna AHD_Numerical criada!
In [6]:
# Criar dataframe agrupado por idade
df_groupedby_age = df.groupby('Age').mean(numeric_only=True).reset_index()
print(f"Dados agrupados por idade: {df_groupedby_age.shape}")
df_groupedby_age.head()
Dados agrupados por idade: (41, 12)
Out[6]:
Age Sex RestBP Chol Fbs RestECG MaxHR ExAng Oldpeak Slope Ca AHD_Numerical
0 29 1.00 130.0 204.00 0.0 2.0 202.0 0.0 0.00 1.00 0.0 0.0
1 34 0.50 118.0 196.00 0.0 1.0 183.0 0.0 0.35 1.00 0.0 0.0
2 35 0.75 126.5 213.75 0.0 0.5 160.5 0.5 0.75 1.25 0.0 0.5
3 37 0.50 125.0 232.50 0.0 0.0 178.5 0.0 1.75 2.00 0.0 0.0
4 38 1.00 129.0 203.00 0.0 0.0 177.5 0.5 1.90 1.50 0.0 0.5

#3 - Introdução ao Plotly Express¶

Plotly Express é a API de alto nível do Plotly - rápida e simples!

Vantagens:¶

  • Sintaxe simples e intuitiva
  • Gráficos interativos automaticamente
  • Menos código que matplotlib
  • Integração perfeita com pandas
  • Hover, zoom e pan já inclusos!

Sintaxe básica:¶

fig = px.tipo_de_grafico(dataframe, x='coluna_x', y='coluna_y')
fig.show()

#4 - Gráficos Básicos com Plotly Express¶

Scatterplot (Gráfico de Dispersão)¶

Exemplo 1: Scatterplot simples

In [7]:
# Scatterplot simples - Idade vs Colesterol
fig = px.scatter(df,
                 x='Age',
                 y='Chol',
                 title='Idade vs Colesterol')
fig.show()

Exemplo 2: Scatterplot com cores por categoria

In [8]:
# Scatterplot com cor por categoria
fig = px.scatter(df,
                 x='Age',
                 y='Chol',
                 color='AHD',  # Colorir por diagnóstico
                 title='Idade vs Colesterol (por diagnóstico)',
                 labels={'Age': 'Idade', 'Chol': 'Colesterol'},
                 hover_data=['Sex', 'RestBP'])  # Dados extras no hover
fig.show()

Exemplo 3: Scatterplot com tamanho variável

In [9]:
# Scatterplot com tamanho variável
fig = px.scatter(df,
                 x='RestBP',
                 y='Chol',
                 color='AHD',
                 size='MaxHR',  # Tamanho baseado em MaxHR
                 title='Pressão vs Colesterol (tamanho = Max Heart Rate)',
                 opacity=0.6)
fig.show()

📈 Line Chart (Gráfico de Linha)¶

Exemplo 1: Linha simples

In [10]:
# Gráfico de linha - Colesterol médio por idade
fig = px.line(df_groupedby_age,
              x='Age',
              y='Chol',
              title='Colesterol Médio por Idade',
              markers=True)  # Adiciona marcadores nos pontos
fig.show()

Exemplo 2: Múltiplas linhas

In [12]:
# Múltiplas linhas no mesmo gráfico
fig = px.line(df_groupedby_age,
              x='Age',
              y=['Chol', 'RestBP', 'MaxHR'],
              title='Múltiplas Métricas por Idade',
              labels={'value': 'Valor', 'variable': 'Métrica', 'Age': 'Idade'})
fig.show()

📊 Bar Chart (Gráfico de Barras)¶

Exemplo 1: Barras verticais

In [ ]:
# Gráfico de barras - Colesterol médio por idade
fig = px.bar(df_groupedby_age,
             x='Age',
             y='Chol',
             title='Colesterol Médio por Idade',
             color='Chol',  # Cor baseada no valor
             color_continuous_scale='Blues')
fig.show()

Exemplo 2: Barras agrupadas

In [17]:
# Preparar dados para barras agrupadas
df_by_age_sex = df.groupby(['Age', 'Sex']).mean(
    numeric_only=True).reset_index()
df_by_age_sex['Sex'] = df_by_age_sex['Sex'].map(
    {0: 'Feminino', 1: 'Masculino'})

# Gráfico de barras agrupadas
fig = px.bar(df_by_age_sex,
             x='Age',
             y='Chol',
             color='Sex',
             barmode='group',  # 'group' ou 'stack'
             title='Colesterol Médio por Idade e Sexo',)
fig.show()

Exemplo 3: Barras horizontais

In [15]:
# Preparar dados
chest_pain_counts = df['ChestPain'].value_counts().reset_index()
chest_pain_counts.columns = ['ChestPain', 'Count']

# Gráfico de barras horizontal
fig = px.bar(chest_pain_counts,
             y='ChestPain',  # y em vez de x para horizontal
             x='Count',
             orientation='h',
             title='Distribuição de Tipo de Dor no Peito',
             color='Count',
             color_continuous_scale='Blues')
fig.show()

📊 Histogram (Histograma)¶

Exemplo 1: Histograma simples

In [18]:
# Histograma simples
fig = px.histogram(df,
                   x='Age',
                   nbins=20,
                   title='Distribuição de Idade',
                   labels={'Age': 'Idade'})
fig.show()

Exemplo 2: Histograma com overlay

In [19]:
# Histograma com overlay por categoria
fig = px.histogram(df,
                   x='Age',
                   color='AHD',
                   nbins=20,
                   title='Distribuição de Idade por Diagnóstico',
                   barmode='overlay',  # 'overlay', 'stack' ou 'group'
                   opacity=0.7)
fig.show()

📦 Box Plot¶

Exemplo 1: Box plot simples

In [20]:
# Box plot simples
fig = px.box(df,
             y='Chol',
             title='Distribuição de Colesterol',
             points='all')  # Mostra todos os pontos
fig.show()

Exemplo 2: Box plot por categoria

In [21]:
# Box plot por categoria
fig = px.box(df,
             x='AHD',
             y='Chol',
             color='AHD',
             title='Colesterol por Diagnóstico de Doença Cardíaca',
             points='outliers')  # Mostra apenas outliers
fig.show()

🎻 Violin Plot¶

In [22]:
# Violin plot - mostra a distribuição
fig = px.violin(df,
                x='AHD',
                y='MaxHR',
                color='AHD',
                box=True,  # Adiciona box plot interno
                points='all',  # Mostra pontos
                title='Distribuição de Frequência Cardíaca Máxima')
fig.show()

🥧 Pie Chart (Gráfico de Pizza)¶

In [28]:
# Preparar dados
ahd_counts = df['AHD'].value_counts().reset_index()
ahd_counts.columns = ['AHD', 'Count']

# Gráfico de pizza
fig = px.pie(ahd_counts,
             values='Count',
             names='AHD',
             title='Distribuição de Doenças Cardíacas',
             color_discrete_sequence=px.colors.sequential.RdBu)
fig.show()

🔥 Heatmap (Mapa de Calor)¶

In [30]:
# Matriz de correlação
correlation_matrix = df[['Age', 'RestBP', 'Chol', 'MaxHR', 'Oldpeak']].corr()

fig = px.imshow(correlation_matrix,
                text_auto=True,  # Mostra valores
                aspect='auto',
                title='Matriz de Correlação',
                color_continuous_scale='Blues')
fig.show()

#5 - Introdução ao Graph Objects (go)¶

Graph Objects oferece controle total sobre cada aspecto do gráfico!

Quando usar go em vez de px?¶

  • Quando precisa de customização avançada
  • Para criar gráficos complexos e únicos
  • Quando precisa de controle fino sobre cada elemento
  • Para construir gráficos incrementalmente

Sintaxe básica:¶

fig = go.Figure()
fig.add_trace(go.Scatter(x=..., y=...))
fig.update_layout(title=...)
fig.show()

#6 - Gráficos com Graph Objects¶

📊 Scatter Plot com go¶

In [31]:
# Scatter plot básico com go
fig = go.Figure()

fig.add_trace(go.Scatter(
    x=df['Age'],
    y=df['Chol'],
    mode='markers',
    marker=dict(size=8, color='blue', opacity=0.6),
    name='Pacientes'
))

fig.update_layout(
    title='Idade vs Colesterol',
    xaxis_title='Idade',
    yaxis_title='Colesterol',
    hovermode='closest'
)

fig.show()

Múltiplas séries no mesmo gráfico:

In [32]:
# Separar por diagnóstico
df_healthy = df[df['AHD'] == 'No']
df_sick = df[df['AHD'] == 'Yes']

fig = go.Figure()

# Adicionar trace para pessoas saudáveis
fig.add_trace(go.Scatter(
    x=df_healthy['RestBP'],
    y=df_healthy['Chol'],
    mode='markers',
    name='Sem Doença',
    marker=dict(size=8, color='green', opacity=0.6)
))

# Adicionar trace para pessoas doentes
fig.add_trace(go.Scatter(
    x=df_sick['RestBP'],
    y=df_sick['Chol'],
    mode='markers',
    name='Com Doença',
    marker=dict(size=8, color='red', opacity=0.6)
))

fig.update_layout(
    title='Pressão vs Colesterol por Diagnóstico',
    xaxis_title='Pressão em Repouso',
    yaxis_title='Colesterol',
    hovermode='closest',
    showlegend=True
)

fig.show()

📈 Line Chart com go¶

In [33]:
fig = go.Figure()

# Primeira linha
fig.add_trace(go.Scatter(
    x=df_groupedby_age['Age'],
    y=df_groupedby_age['Chol'],
    mode='lines+markers',
    name='Colesterol',
    line=dict(color='blue', width=3),
    marker=dict(size=8)
))

# Segunda linha
fig.add_trace(go.Scatter(
    x=df_groupedby_age['Age'],
    y=df_groupedby_age['RestBP'],
    mode='lines+markers',
    name='Pressão',
    line=dict(color='red', width=3, dash='dash'),
    marker=dict(size=8)
))

fig.update_layout(
    title='Métricas Médias por Idade',
    xaxis_title='Idade',
    yaxis_title='Valor',
    hovermode='x unified'
)

fig.show()

📊 Bar Chart com go¶

In [34]:
fig = go.Figure()

fig.add_trace(go.Bar(
    x=df_groupedby_age['Age'],
    y=df_groupedby_age['Chol'],
    name='Colesterol',
    marker_color='indianred'
))

fig.add_trace(go.Bar(
    x=df_groupedby_age['Age'],
    y=df_groupedby_age['RestBP'],
    name='Pressão',
    marker_color='lightsalmon'
))

fig.update_layout(
    title='Comparação de Métricas por Idade',
    xaxis_title='Idade',
    yaxis_title='Valor',
    barmode='group'  # 'group', 'stack', 'relative'
)

fig.show()

🥧 Donut Chart com go¶

In [35]:
ahd_counts = df['AHD'].value_counts()

fig = go.Figure(data=[go.Pie(
    labels=ahd_counts.index,
    values=ahd_counts.values,
    hole=0.3,  # Cria um donut chart (0 = pie normal)
    marker=dict(colors=['green', 'red']),
    textinfo='label+percent',
    hoverinfo='label+value+percent'
)])

fig.update_layout(
    title='Distribuição de Doenças Cardíacas (Donut Chart)'
)

fig.show()

#7 - Customizações e Layouts¶

Cores e Estilos Avançados¶

In [36]:
# Scatter plot super customizado
fig = go.Figure()

fig.add_trace(go.Scatter(
    x=df['Age'],
    y=df['Chol'],
    mode='markers',
    marker=dict(
        size=df['MaxHR'] / 10,  # Tamanho variável
        color=df['RestBP'],  # Cor baseada em RestBP
        colorscale='Viridis',  # Escala de cores
        showscale=True,
        colorbar=dict(title="Pressão"),
        line=dict(width=1, color='white')  # Borda branca
    ),
    text=df['AHD'],
    hovertemplate='<b>Idade</b>: %{x}<br><b>Colesterol</b>: %{y}<br><b>Diagnóstico</b>: %{text}'
))

fig.update_layout(
    title=dict(
        text='Análise Avançada de Pacientes',
        font=dict(size=24, color='darkblue')
    ),
    xaxis=dict(
        title='Idade',
        gridcolor='lightgray',
        showgrid=True
    ),
    yaxis=dict(
        title='Colesterol',
        gridcolor='lightgray',
        showgrid=True
    ),
    plot_bgcolor='white',
    hovermode='closest'
)

fig.show()

🖼️ Tamanho da Figura¶

In [38]:
fig = px.scatter(df, x='Age', y='Chol', color='AHD')

fig.update_layout(
    width=1000,  # Largura em pixels
    height=600,  # Altura em pixels
    title='Gráfico com Tamanho Customizado'
)

fig.show()

Templates (Temas)¶

Temas disponíveis: plotly, plotly_white, plotly_dark, ggplot2, seaborn, simple_white, none

In [39]:
# Tema escuro
fig = px.scatter(df, x='Age', y='Chol', color='AHD', template='plotly_dark')
fig.update_layout(title='Tema Escuro')
fig.show()
In [40]:
# Tema seaborn
fig = px.scatter(df, x='Age', y='Chol', color='AHD', template='seaborn')
fig.update_layout(title='Tema Seaborn')
fig.show()
In [41]:
# Tema simples branco
fig = px.scatter(df, x='Age', y='Chol', color='AHD', template='simple_white')
fig.update_layout(title='Tema Simple White')
fig.show()

#8 - Subplots com Plotly¶

📊 Grid 2x2 de Subplots¶

In [42]:
from plotly.subplots import make_subplots

# Criar figura com 2x2 subplots
fig = make_subplots(
    rows=2, cols=2,
    subplot_titles=('Scatter', 'Line', 'Bar', 'Box')
)

# Subplot 1: Scatter
fig.add_trace(
    go.Scatter(x=df['Age'], y=df['Chol'], mode='markers', name='Scatter'),
    row=1, col=1
)

# Subplot 2: Line
fig.add_trace(
    go.Scatter(x=df_groupedby_age['Age'], y=df_groupedby_age['Chol'],
               mode='lines', name='Line'),
    row=1, col=2
)

# Subplot 3: Bar
fig.add_trace(
    go.Bar(x=df_groupedby_age['Age'],
           y=df_groupedby_age['RestBP'], name='Bar'),
    row=2, col=1
)

# Subplot 4: Box
fig.add_trace(
    go.Box(y=df['Chol'], name='Box'),
    row=2, col=2
)

fig.update_layout(height=800, showlegend=False,
                  title_text="Dashboard de Subplots")
fig.show()

Subplots Verticais com Eixo X Compartilhado¶

In [43]:
fig = make_subplots(
    rows=3, cols=1,
    shared_xaxes=True,  # Compartilha eixo X
    vertical_spacing=0.05,
    subplot_titles=('Colesterol', 'Pressão', 'Max HR')
)

fig.add_trace(
    go.Scatter(x=df_groupedby_age['Age'], y=df_groupedby_age['Chol'],
               name='Colesterol', line=dict(color='blue')),
    row=1, col=1
)

fig.add_trace(
    go.Scatter(x=df_groupedby_age['Age'], y=df_groupedby_age['RestBP'],
               name='Pressão', line=dict(color='red')),
    row=2, col=1
)

fig.add_trace(
    go.Scatter(x=df_groupedby_age['Age'], y=df_groupedby_age['MaxHR'],
               name='Max HR', line=dict(color='green')),
    row=3, col=1
)

fig.update_layout(height=800, title_text="Métricas por Idade")
fig.update_xaxes(title_text="Idade", row=3, col=1)
fig.show()

Subplot Misto (Scatter + Pie)¶

In [44]:
fig = make_subplots(
    rows=1, cols=2,
    specs=[[{"type": "scatter"}, {"type": "domain"}]],  # domain para pie
    subplot_titles=('Scatter Plot', 'Pie Chart')
)

# Scatter plot
fig.add_trace(
    go.Scatter(x=df['Age'], y=df['Chol'], mode='markers', name='Pacientes'),
    row=1, col=1
)

# Pie chart
ahd_counts = df['AHD'].value_counts()
fig.add_trace(
    go.Pie(labels=ahd_counts.index, values=ahd_counts.values, name='Diagnóstico'),
    row=1, col=2
)

fig.update_layout(height=500, showlegend=True, title_text="Dashboard Misto")
fig.show()

#9 - Interatividade¶

Botões para Alternar Métricas¶

In [45]:
# Criar gráfico com botões
fig = go.Figure()

# Adicionar todas as traces
fig.add_trace(go.Scatter(
    x=df_groupedby_age['Age'],
    y=df_groupedby_age['Chol'],
    name='Colesterol',
    visible=True  # Visível por padrão
))

fig.add_trace(go.Scatter(
    x=df_groupedby_age['Age'],
    y=df_groupedby_age['RestBP'],
    name='Pressão',
    visible=False
))

fig.add_trace(go.Scatter(
    x=df_groupedby_age['Age'],
    y=df_groupedby_age['MaxHR'],
    name='Max HR',
    visible=False
))

# Criar botões
fig.update_layout(
    updatemenus=[
        dict(
            buttons=list([
                dict(label="Colesterol",
                     method="update",
                     args=[{"visible": [True, False, False]},
                           {"title": "Colesterol Médio por Idade"}]),
                dict(label="Pressão",
                     method="update",
                     args=[{"visible": [False, True, False]},
                           {"title": "Pressão Média por Idade"}]),
                dict(label="Max HR",
                     method="update",
                     args=[{"visible": [False, False, True]},
                           {"title": "Frequência Cardíaca Máxima por Idade"}]),
            ]),
            direction="down",
            showactive=True,
            x=0.1,
            y=1.15
        )
    ],
    title="Selecione a Métrica"
)

fig.show()

📊 Range Slider¶

In [46]:
fig = px.line(df_groupedby_age, x='Age', y='Chol',
              title='Colesterol por Idade com Range Slider')

fig.update_xaxes(rangeslider_visible=True)

fig.show()

🔍 Hover Customizado e Detalhado¶

In [47]:
fig = go.Figure()

fig.add_trace(go.Scatter(
    x=df['Age'],
    y=df['Chol'],
    mode='markers',
    marker=dict(size=10, color=df['RestBP'],
                colorscale='Viridis', showscale=True),
    text=df['AHD'],
    customdata=np.column_stack((df['Sex'], df['RestBP'], df['MaxHR'])),
    hovertemplate='<b>Idade:</b> %{x}<br>' +
                  '<b>Colesterol:</b> %{y}<br>' +
                  '<b>Diagnóstico:</b> %{text}<br>' +
                  '<b>Sexo:</b> %{customdata[0]}<br>' +
                  '<b>Pressão:</b> %{customdata[1]}<br>' +
                  '<b>Max HR:</b> %{customdata[2]}<br>' +
                  '<extra></extra>'  # Remove o trace name
))

fig.update_layout(
    title='Hover Customizado com Múltiplas Informações',
    hovermode='closest'
)

fig.show()

#10 - Perguntas Comuns¶

Como salvar um gráfico?¶

In [48]:
fig = px.scatter(df, x='Age', y='Chol', color='AHD')

# Salvar como HTML (interativo)
fig.write_html("meu_grafico.html")
print("✅ Gráfico salvo como HTML!")

# Para salvar como imagem PNG/PDF, precisa instalar kaleido:
# !pip install kaleido
# fig.write_image("meu_grafico.png", width=1200, height=800)
# fig.write_image("meu_grafico.pdf")
✅ Gráfico salvo como HTML!

Como mudar a paleta de cores?¶

In [49]:
# Paletas qualitativas (categorias)
fig = px.scatter(df, x='Age', y='Chol', color='ChestPain',
                 color_discrete_sequence=px.colors.qualitative.Set2,
                 title='Paleta Set2')
fig.show()
In [50]:
# Paletas contínuas (valores numéricos)
fig = px.scatter(df, x='Age', y='Chol', color='RestBP',
                 color_continuous_scale='Viridis',
                 title='Escala Viridis')
# Outras: 'Plasma', 'Inferno', 'Turbo', 'Blues', 'Reds', 'RdBu'
fig.show()
In [51]:
# Ver todas as paletas disponíveis
print("Paletas qualitativas:")
print(dir(px.colors.qualitative))
print("\nPaletas sequenciais:")
print(dir(px.colors.sequential))
Paletas qualitativas:
['Alphabet', 'Alphabet_r', 'Antique', 'Antique_r', 'Bold', 'Bold_r', 'D3', 'D3_r', 'Dark2', 'Dark24', 'Dark24_r', 'Dark2_r', 'G10', 'G10_r', 'Light24', 'Light24_r', 'Pastel', 'Pastel1', 'Pastel1_r', 'Pastel2', 'Pastel2_r', 'Pastel_r', 'Plotly', 'Plotly_r', 'Prism', 'Prism_r', 'Safe', 'Safe_r', 'Set1', 'Set1_r', 'Set2', 'Set2_r', 'Set3', 'Set3_r', 'T10', 'T10_r', 'Vivid', 'Vivid_r', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_swatches', 'swatches']

Paletas sequenciais:
['Aggrnyl', 'Aggrnyl_r', 'Agsunset', 'Agsunset_r', 'Blackbody', 'Blackbody_r', 'Bluered', 'Bluered_r', 'Blues', 'Blues_r', 'Blugrn', 'Blugrn_r', 'Bluyl', 'Bluyl_r', 'Brwnyl', 'Brwnyl_r', 'BuGn', 'BuGn_r', 'BuPu', 'BuPu_r', 'Burg', 'Burg_r', 'Burgyl', 'Burgyl_r', 'Cividis', 'Cividis_r', 'Darkmint', 'Darkmint_r', 'Electric', 'Electric_r', 'Emrld', 'Emrld_r', 'GnBu', 'GnBu_r', 'Greens', 'Greens_r', 'Greys', 'Greys_r', 'Hot', 'Hot_r', 'Inferno', 'Inferno_r', 'Jet', 'Jet_r', 'Magenta', 'Magenta_r', 'Magma', 'Magma_r', 'Mint', 'Mint_r', 'OrRd', 'OrRd_r', 'Oranges', 'Oranges_r', 'Oryel', 'Oryel_r', 'Peach', 'Peach_r', 'Pinkyl', 'Pinkyl_r', 'Plasma', 'Plasma_r', 'Plotly3', 'Plotly3_r', 'PuBu', 'PuBuGn', 'PuBuGn_r', 'PuBu_r', 'PuRd', 'PuRd_r', 'Purp', 'Purp_r', 'Purples', 'Purples_r', 'Purpor', 'Purpor_r', 'Rainbow', 'Rainbow_r', 'RdBu', 'RdBu_r', 'RdPu', 'RdPu_r', 'Redor', 'Redor_r', 'Reds', 'Reds_r', 'Sunset', 'Sunset_r', 'Sunsetdark', 'Sunsetdark_r', 'Teal', 'Teal_r', 'Tealgrn', 'Tealgrn_r', 'Turbo', 'Turbo_r', 'Viridis', 'Viridis_r', 'YlGn', 'YlGnBu', 'YlGnBu_r', 'YlGn_r', 'YlOrBr', 'YlOrBr_r', 'YlOrRd', 'YlOrRd_r', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_swatches', '_swatches_continuous', 'algae', 'algae_r', 'amp', 'amp_r', 'deep', 'deep_r', 'dense', 'dense_r', 'gray', 'gray_r', 'haline', 'haline_r', 'ice', 'ice_r', 'matter', 'matter_r', 'solar', 'solar_r', 'speed', 'speed_r', 'swatches', 'swatches_continuous', 'tempo', 'tempo_r', 'thermal', 'thermal_r', 'turbid', 'turbid_r']

Como adicionar anotações?¶

In [59]:
fig = px.scatter(df, x='Age', y='Chol')

fig.add_annotation(
    x=67,
    y=568,
    text="Ponto de atenção!",
    showarrow=True,
    arrowhead=2,
    arrowsize=1,
    arrowwidth=2,
    arrowcolor="red",
    font=dict(size=14, color="red"),
    bgcolor="yellow",
    opacity=0.8
)

fig.show()

Como adicionar linhas de referência?¶

In [60]:
fig = px.scatter(df, x='RestBP', y='Chol')

# Linha horizontal
fig.add_hline(y=250, line_dash="dash", line_color="red",
              annotation_text="Limite de colesterol")

# Linha vertical
fig.add_vline(x=140, line_dash="dash", line_color="blue",
              annotation_text="Limite de pressão")

fig.show()

Como criar gráfico 3D?¶

In [61]:
fig = px.scatter_3d(df,
                    x='Age',
                    y='RestBP',
                    z='Chol',
                    color='AHD',
                    size='MaxHR',
                    title='Visualização 3D',
                    opacity=0.7)
fig.show()

Como remover a barra de ferramentas?¶

In [64]:
fig = px.scatter(df, x='Age', y='Chol')

# Remove o modebar (barra de ferramentas)
fig.show(config={'displayModeBar': False})

Como fazer animações?¶

In [65]:
# Criar dados temporais simulados
df_temp = df.copy()
df_temp['Year'] = np.random.choice([2020, 2021, 2022, 2023], size=len(df))

fig = px.scatter(df_temp,
                 x='Age',
                 y='Chol',
                 animation_frame='Year',  # Cria animação
                 color='AHD',
                 size='MaxHR',
                 range_x=[20, 80],
                 range_y=[100, 600],
                 title='Animação por Ano')
fig.show()

Como adicionar múltiplas anotações?¶

In [66]:
fig = px.scatter(df, x='Age', y='Chol', color='AHD')

# Adicionar várias anotações
annotations = [
    dict(x=40, y=400, text="Zona 1", showarrow=False, bgcolor="lightblue"),
    dict(x=60, y=300, text="Zona 2", showarrow=False, bgcolor="lightgreen"),
    dict(x=70, y=500, text="Zona 3", showarrow=False, bgcolor="lightyellow")
]

fig.update_layout(annotations=annotations,
                  title="Gráfico com Múltiplas Anotações")
fig.show()

Como fazer um gráfico de área?¶

In [67]:
fig = px.area(df_groupedby_age,
              x='Age',
              y='Chol',
              title='Gráfico de Área - Colesterol por Idade')
fig.show()

Como criar um gráfico de densidade (contorno)?¶

In [68]:
fig = px.density_contour(df,
                         x='Age',
                         y='Chol',
                         title='Densidade - Idade vs Colesterol')
fig.show()
In [69]:
# Com cores preenchidas
fig = px.density_heatmap(df,
                         x='Age',
                         y='Chol',
                         title='Heatmap de Densidade')
fig.show()

Como criar um gráfico de sunburst?¶

In [70]:
# Preparar dados hierárquicos
df_sunburst = df.groupby(['AHD', 'ChestPain']).size().reset_index(name='Count')

fig = px.sunburst(df_sunburst,
                  path=['AHD', 'ChestPain'],
                  values='Count',
                  title='Sunburst - Diagnóstico e Tipo de Dor')
fig.show()

Resumo Final¶

Plotly Express (px) vs Graph Objects (go)¶

Aspecto Plotly Express Graph Objects
Sintaxe Simples, uma linha Mais verbosa
Velocidade de código Rápido Mais código
Customização Limitada Controle total
Melhor para Exploração rápida Visualizações complexas
Curva de aprendizado Fácil Média

Quando usar cada um?¶

Use Plotly Express quando:

  • Está explorando dados rapidamente
  • Precisa de um gráfico simples
  • O gráfico padrão já atende suas necessidades

Use Graph Objects quando:

  • Precisa de customização avançada
  • Quer controle total sobre cada elemento
  • Está criando dashboards complexos
  • Precisa adicionar traces incrementalmente

Desafios para Praticar¶

Tente criar estes gráficos por conta própria:

  1. Desafio 1: Criar um dashboard 2x2 com:

    • Scatter plot de Age vs MaxHR
    • Box plot de Chol por ChestPain
    • Histogram de RestBP
    • Pie chart de Sex
  2. Desafio 2: Criar um gráfico interativo com botões que alternam entre:

    • Scatter plot
    • Line plot
    • Bar plot (dos mesmos dados)
  3. Desafio 3: Criar um gráfico 3D com Age, Chol e RestBP, colorido por AHD

  4. Desafio 4: Criar um heatmap de correlação estilizado com:

    • Cores customizadas
    • Valores nas células
    • Título e labels personalizados